﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AT.IBMS.Framework.Tools
{
    public static class StringTool
    {

        /// <summary>
        /// 截取字符串。
        /// </summary>
        /// <param name="str">原字符串。</param>
        /// <param name="byteLength">要截取的字节长度。</param>
        /// <param name="tag">是否自动在截取后的字符串添加省略标记。</param>
        /// <returns>截取后的字符串。</returns>
        /// <remarks>
        /// 一个汉字占两个字节。
        /// 为了方便汉字截取参数 byteLenght 只接受偶数，如果是基数则自动加1。
        /// </remarks>
        public static string InterceptString(this Tool t, string str, int byteLength, bool tag)
        {

            byte[] bytes;
            int n = 0;
            int i = 0;
            string result;

            if (string.IsNullOrEmpty(str))
            {
                return "";
            }

            if (byteLength <= 0)
            {
                throw new ArgumentNullException("byteLength");
            }

            bytes = Encoding.Unicode.GetBytes(str);

            for (; i < bytes.GetLength(0) && n < byteLength; i++)
            {

                //  偶数位置，如0、2、4等，为UCS2编码中两个字节的第一个字节
                if (i % 2 == 0)
                {
                    n++;      //  在UCS2第一个字节时n加1
                }
                else
                {
                    if (bytes[i] > 0)
                    {
                        n++;
                    }
                }
            }

            //  如果i为奇数时，处理成偶数
            if (i % 2 == 1)
            {
                //  该UCS2字符是汉字时，去掉这个截一半的汉字
                if (bytes[i] > 0)
                {
                    i = i - 1;
                }
                else // 该UCS2字符是字母或数字，则保留该字符
                {
                    i = i + 1;
                }
            }

            result = System.Text.Encoding.Unicode.GetString(bytes, 0, i);

            //如果需要添加省略标记。
            if (tag && result.Length < str.Length)
            {
                result += "...";
            }

            return result;

        }

        /// <summary>
        /// 移除中文、字母和数字之外的字符
        /// </summary>
        /// <param name="s">要检测的字符串</param>
        /// <returns></returns>
        public static string RemoveEspeciallyString(this Tool t, string s)
        {
            if (string.IsNullOrEmpty(s))
                return s;
            if (CheckChineseAndNumber(t,s))
                return s;
            System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[\u4E00-\u9FA5,0-9,a-z,A-Z]");
            char[] cArray = s.ToCharArray();
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            foreach (var c in cArray)
            {
                if (reg.IsMatch(c.ToString()))
                {
                    sb.Append(c);
                }
            }
            return sb.ToString();
        }

        /// <summary>
        /// 检测字符串是否只包含中文、字母和数字
        /// </summary>
        /// <param name="s">要检测的字符串</param>
        /// <returns></returns>
        public static bool CheckChineseAndNumber(this Tool t, string s)
        {
            if (string.IsNullOrEmpty(s))
                return true;
            System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("^[\u4E00-\u9FA5,0-9,a-z,A-Z]$");
            if (!reg.IsMatch(s))
            {
                return false;
            }
            return true;
        }

    }
}
